CM3D2 Converter.misc_DATA_PT_vertex_groups

  1# 「プロパティ」エリア → 「メッシュデータ」タブ → 「頂点グループ」パネル
  2import re
  3import bpy
  4from . import common
  5from . import compat
  6
  7
  8# メニュー等に項目追加
  9def menu_func(self, context):
 10    ob = context.active_object
 11    if not ob or len(ob.vertex_groups) == 0 and ob.type != 'MESH':
 12        return
 13
 14    flag = False
 15    for vertex_group in ob.vertex_groups:
 16        if not flag and re.search(r'[_ ]([rRlL])[_ ]', vertex_group.name):
 17            flag = True
 18        if not flag and vertex_group.name.count('*') == 1:
 19            if re.search(r'\.([rRlL])$', vertex_group.name):
 20                flag = True
 21        if flag:
 22            col = self.layout.column(align=True)
 23            col.label(text="CM3D2用 頂点グループ名変換", icon_value=common.kiss_icon())
 24            row = col.row(align=True)
 25            row.operator('object.decode_cm3d2_vertex_group_names', icon='BLENDER', text="CM3D2 → Blender")
 26            row.operator('object.encode_cm3d2_vertex_group_names', icon_value=common.kiss_icon(), text="Blender → CM3D2")
 27            break
 28
 29
 30@compat.BlRegister()
 31class CNV_OT_decode_cm3d2_vertex_group_names(bpy.types.Operator):
 32    bl_idname = 'object.decode_cm3d2_vertex_group_names'
 33    bl_label = "頂点グループ名をCM3D2用→Blender用に変換"
 34    bl_description = "CM3D2で使われてるボーン名(頂点グループ名)をBlenderで左右対称編集できるように変換します"
 35    bl_options = {'REGISTER', 'UNDO'}
 36
 37    @classmethod
 38    def poll(cls, context):
 39        import re
 40        ob = context.active_object
 41        if ob and ob.type == 'MESH':
 42            if ob.vertex_groups.active:
 43                for vg in ob.vertex_groups:
 44                    if re.search(r'[_ ]([rRlL])[_ ]', vg.name):
 45                        return True
 46        return False
 47
 48    def execute(self, context):
 49        ob = context.active_object
 50        me = ob.data
 51        convert_count = 0
 52        context.window_manager.progress_begin(0, len(ob.vertex_groups))
 53        for vg_index, vg in enumerate(ob.vertex_groups[:]):
 54            context.window_manager.progress_update(vg_index)
 55            vg_name = common.decode_bone_name(vg.name)
 56            if vg_name != vg.name:
 57                if vg_name in ob.vertex_groups:
 58                    target_vg = ob.vertex_groups[vg_name]
 59                    for vert in me.vertices:
 60                        try:
 61                            weight = vg.weight(vert.index)
 62                        except:
 63                            weight = 0.0
 64                        try:
 65                            target_weight = target_vg.weight(vert.index)
 66                        except:
 67                            target_weight = 0.0
 68                        if 0.0 < weight + target_weight:
 69                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
 70                    ob.vertex_groups.remove(vg)
 71                else:
 72                    vg.name = vg_name
 73                convert_count += 1
 74        if convert_count == 0:
 75            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
 76        else:
 77            self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました")
 78        context.window_manager.progress_end()
 79        return {'FINISHED'}
 80
 81
 82@compat.BlRegister()
 83class CNV_OT_encode_cm3d2_vertex_group_names(bpy.types.Operator):
 84    bl_idname = 'object.encode_cm3d2_vertex_group_names'
 85    bl_label = "頂点グループ名をBlender用→CM3D2用に変換"
 86    bl_description = "CM3D2で使われてるボーン名(頂点グループ名)に戻します"
 87    bl_options = {'REGISTER', 'UNDO'}
 88
 89    @classmethod
 90    def poll(cls, context):
 91        ob = context.active_object
 92        if ob and ob.type == 'MESH' and ob.vertex_groups.active:
 93            for vg in ob.vertex_groups:
 94                if vg.name.count('*') == 1 and re.search(r'\.([rRlL])$', vg.name):
 95                    return True
 96        return False
 97
 98    def execute(self, context):
 99        ob = context.active_object
100        me = ob.data
101        convert_count = 0
102        context.window_manager.progress_begin(0, len(ob.vertex_groups))
103        for vg_index, vg in enumerate(ob.vertex_groups[:]):
104            context.window_manager.progress_update(vg_index)
105            vg_name = common.encode_bone_name(vg.name)
106            if vg_name != vg.name:
107                if vg_name in ob.vertex_groups:
108                    target_vg = ob.vertex_groups[vg_name]
109                    for vert in me.vertices:
110                        try:
111                            weight = vg.weight(vert.index)
112                        except:
113                            weight = 0.0
114
115                        try:
116                            target_weight = target_vg.weight(vert.index)
117                        except:
118                            target_weight = 0.0
119                        if 0.0 < weight + target_weight:
120                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
121                    ob.vertex_groups.remove(vg)
122                else:
123                    vg.name = vg_name
124                convert_count += 1
125        if convert_count == 0:
126            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
127        else:
128            self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました")
129        context.window_manager.progress_end()
130        return {'FINISHED'}
@compat.BlRegister()
class CNV_OT_decode_cm3d2_vertex_group_names(bpy_types.Operator):
31@compat.BlRegister()
32class CNV_OT_decode_cm3d2_vertex_group_names(bpy.types.Operator):
33    bl_idname = 'object.decode_cm3d2_vertex_group_names'
34    bl_label = "頂点グループ名をCM3D2用→Blender用に変換"
35    bl_description = "CM3D2で使われてるボーン名(頂点グループ名)をBlenderで左右対称編集できるように変換します"
36    bl_options = {'REGISTER', 'UNDO'}
37
38    @classmethod
39    def poll(cls, context):
40        import re
41        ob = context.active_object
42        if ob and ob.type == 'MESH':
43            if ob.vertex_groups.active:
44                for vg in ob.vertex_groups:
45                    if re.search(r'[_ ]([rRlL])[_ ]', vg.name):
46                        return True
47        return False
48
49    def execute(self, context):
50        ob = context.active_object
51        me = ob.data
52        convert_count = 0
53        context.window_manager.progress_begin(0, len(ob.vertex_groups))
54        for vg_index, vg in enumerate(ob.vertex_groups[:]):
55            context.window_manager.progress_update(vg_index)
56            vg_name = common.decode_bone_name(vg.name)
57            if vg_name != vg.name:
58                if vg_name in ob.vertex_groups:
59                    target_vg = ob.vertex_groups[vg_name]
60                    for vert in me.vertices:
61                        try:
62                            weight = vg.weight(vert.index)
63                        except:
64                            weight = 0.0
65                        try:
66                            target_weight = target_vg.weight(vert.index)
67                        except:
68                            target_weight = 0.0
69                        if 0.0 < weight + target_weight:
70                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
71                    ob.vertex_groups.remove(vg)
72                else:
73                    vg.name = vg_name
74                convert_count += 1
75        if convert_count == 0:
76            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
77        else:
78            self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました")
79        context.window_manager.progress_end()
80        return {'FINISHED'}
bl_idname = 'object.decode_cm3d2_vertex_group_names'
bl_label = '頂点グループ名をCM3D2用→Blender用に変換'
bl_description = 'CM3D2で使われてるボーン名(頂点グループ名)をBlenderで左右対称編集できるように変換します'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
38    @classmethod
39    def poll(cls, context):
40        import re
41        ob = context.active_object
42        if ob and ob.type == 'MESH':
43            if ob.vertex_groups.active:
44                for vg in ob.vertex_groups:
45                    if re.search(r'[_ ]([rRlL])[_ ]', vg.name):
46                        return True
47        return False
def execute(self, context):
49    def execute(self, context):
50        ob = context.active_object
51        me = ob.data
52        convert_count = 0
53        context.window_manager.progress_begin(0, len(ob.vertex_groups))
54        for vg_index, vg in enumerate(ob.vertex_groups[:]):
55            context.window_manager.progress_update(vg_index)
56            vg_name = common.decode_bone_name(vg.name)
57            if vg_name != vg.name:
58                if vg_name in ob.vertex_groups:
59                    target_vg = ob.vertex_groups[vg_name]
60                    for vert in me.vertices:
61                        try:
62                            weight = vg.weight(vert.index)
63                        except:
64                            weight = 0.0
65                        try:
66                            target_weight = target_vg.weight(vert.index)
67                        except:
68                            target_weight = 0.0
69                        if 0.0 < weight + target_weight:
70                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
71                    ob.vertex_groups.remove(vg)
72                else:
73                    vg.name = vg_name
74                convert_count += 1
75        if convert_count == 0:
76            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
77        else:
78            self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました")
79        context.window_manager.progress_end()
80        return {'FINISHED'}
bl_rna = <bpy_struct, Struct("OBJECT_OT_decode_cm3d2_vertex_group_names")>
Inherited Members
bpy_types.Operator
as_keywords
poll_message_set
builtins.bpy_struct
keys
values
items
get
pop
as_pointer
keyframe_insert
keyframe_delete
driver_add
driver_remove
is_property_set
property_unset
is_property_hidden
is_property_readonly
is_property_overridable_library
property_overridable_library_set
path_resolve
path_from_id
type_recast
bl_rna_get_subclass_py
bl_rna_get_subclass
id_properties_ensure
id_properties_clear
id_properties_ui
id_data
@compat.BlRegister()
class CNV_OT_encode_cm3d2_vertex_group_names(bpy_types.Operator):
 83@compat.BlRegister()
 84class CNV_OT_encode_cm3d2_vertex_group_names(bpy.types.Operator):
 85    bl_idname = 'object.encode_cm3d2_vertex_group_names'
 86    bl_label = "頂点グループ名をBlender用→CM3D2用に変換"
 87    bl_description = "CM3D2で使われてるボーン名(頂点グループ名)に戻します"
 88    bl_options = {'REGISTER', 'UNDO'}
 89
 90    @classmethod
 91    def poll(cls, context):
 92        ob = context.active_object
 93        if ob and ob.type == 'MESH' and ob.vertex_groups.active:
 94            for vg in ob.vertex_groups:
 95                if vg.name.count('*') == 1 and re.search(r'\.([rRlL])$', vg.name):
 96                    return True
 97        return False
 98
 99    def execute(self, context):
100        ob = context.active_object
101        me = ob.data
102        convert_count = 0
103        context.window_manager.progress_begin(0, len(ob.vertex_groups))
104        for vg_index, vg in enumerate(ob.vertex_groups[:]):
105            context.window_manager.progress_update(vg_index)
106            vg_name = common.encode_bone_name(vg.name)
107            if vg_name != vg.name:
108                if vg_name in ob.vertex_groups:
109                    target_vg = ob.vertex_groups[vg_name]
110                    for vert in me.vertices:
111                        try:
112                            weight = vg.weight(vert.index)
113                        except:
114                            weight = 0.0
115
116                        try:
117                            target_weight = target_vg.weight(vert.index)
118                        except:
119                            target_weight = 0.0
120                        if 0.0 < weight + target_weight:
121                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
122                    ob.vertex_groups.remove(vg)
123                else:
124                    vg.name = vg_name
125                convert_count += 1
126        if convert_count == 0:
127            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
128        else:
129            self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました")
130        context.window_manager.progress_end()
131        return {'FINISHED'}
bl_idname = 'object.encode_cm3d2_vertex_group_names'
bl_label = '頂点グループ名をBlender用→CM3D2用に変換'
bl_description = 'CM3D2で使われてるボーン名(頂点グループ名)に戻します'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
90    @classmethod
91    def poll(cls, context):
92        ob = context.active_object
93        if ob and ob.type == 'MESH' and ob.vertex_groups.active:
94            for vg in ob.vertex_groups:
95                if vg.name.count('*') == 1 and re.search(r'\.([rRlL])$', vg.name):
96                    return True
97        return False
def execute(self, context):
 99    def execute(self, context):
100        ob = context.active_object
101        me = ob.data
102        convert_count = 0
103        context.window_manager.progress_begin(0, len(ob.vertex_groups))
104        for vg_index, vg in enumerate(ob.vertex_groups[:]):
105            context.window_manager.progress_update(vg_index)
106            vg_name = common.encode_bone_name(vg.name)
107            if vg_name != vg.name:
108                if vg_name in ob.vertex_groups:
109                    target_vg = ob.vertex_groups[vg_name]
110                    for vert in me.vertices:
111                        try:
112                            weight = vg.weight(vert.index)
113                        except:
114                            weight = 0.0
115
116                        try:
117                            target_weight = target_vg.weight(vert.index)
118                        except:
119                            target_weight = 0.0
120                        if 0.0 < weight + target_weight:
121                            target_vg.add([vert.index], weight + target_weight, 'REPLACE')
122                    ob.vertex_groups.remove(vg)
123                else:
124                    vg.name = vg_name
125                convert_count += 1
126        if convert_count == 0:
127            self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした")
128        else:
129            self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました")
130        context.window_manager.progress_end()
131        return {'FINISHED'}
bl_rna = <bpy_struct, Struct("OBJECT_OT_encode_cm3d2_vertex_group_names")>
Inherited Members
bpy_types.Operator
as_keywords
poll_message_set
builtins.bpy_struct
keys
values
items
get
pop
as_pointer
keyframe_insert
keyframe_delete
driver_add
driver_remove
is_property_set
property_unset
is_property_hidden
is_property_readonly
is_property_overridable_library
property_overridable_library_set
path_resolve
path_from_id
type_recast
bl_rna_get_subclass_py
bl_rna_get_subclass
id_properties_ensure
id_properties_clear
id_properties_ui
id_data